#include <string.h>
#include <stdio.h>

#include "getopt.h"

int opterr = 1, /* if error message should be printed */
    optind = 1, /* index into parent argv vector */
    optopt, /* character checked for validity */
    optreset; /* reset getopt */
const char *optarg; /* argument associated with option */

#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""

/*
 * getopt --
 *      Parse argc/argv argument vector.
 */
int getopt(int nargc, char * const nargv[], const char *ostr)
{
    static const char *place = EMSG;  /* option letter processing */
    const char *oli;                  /* option letter list index */

    if (optreset || !*place) {        /* update scanning pointer */
        optreset = 0;
        if (optind >= nargc || *(place = nargv[optind]) != '-') {
            place = EMSG;
            return (-1);
        }

        if (place[1] && *++place == '-') {      /* found "--" */
            ++optind;
            place = EMSG;
            return (-1);
        }
    }                                       /* option letter okay? */

    if ((optopt = (int)*place++) == (int)':' ||
            !(oli = strchr (ostr, optopt))) {
        /*
         * if the user didn't specify '-' as an option,
         * assume it means -1.
         */
        if (optopt == (int)'-')
            return (-1);
        if (!*place)
            ++optind;
        if (opterr && *ostr != ':')
            (void)printf ("illegal option -- %c\n", optopt);
        return (BADCH);
    }

    if (*++oli != ':') {              /* don't need argument */
        optarg = NULL;
        if (!*place)
            ++optind;
    } else {                          /* need an argument */
        if (*place)                   /* no white space */
            optarg = place;
        else if (nargc <= ++optind) { /* no arg */
            place = EMSG;
            if (*ostr == ':')
                return (BADARG);
            if (opterr)
                (void)printf ("option requires an argument -- %c\n", optopt);
            return (BADCH);
        } else                        /* white space */
            optarg = nargv[optind];
        place = EMSG;
        ++optind;
    }

    return optopt;        /* dump back option letter */
}
